package com.gaj.util;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.*;

import org.apache.poi.hwpf.HWPFDocument;
import org.apache.poi.hwpf.usermodel.Range;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFParagraph;
import org.apache.poi.xwpf.usermodel.XWPFTable;
import org.apache.poi.xwpf.usermodel.XWPFTableRow;
import org.apache.poi.xwpf.usermodel.XWPFTableCell;

/**
 * 基于BJCM政法智能办案平台接口标准构建FTP共享文件夹结构
 * 依据：BJCM政法智能办案平台中心平台项目技术接口标准合版V4.5.4.2.docx 2.3系统对接目录规范
 */
public class FtpDirBuilder {
    // 根路径：D:\Programs\FTP共享文件夹\bjcm
    private static final String ROOT_PATH = "D:\\Programs\\FTP共享文件夹\\bjcm";

    private static final String DICT_PATH = "D:\\idea_projects\\gajSpringBoot\\doc\\sql\\字典数据";

    // 政法单位编码映射（单位名称→目录编码）
    private static final Map<String, String> UNIT_CODE_MAP = new HashMap<>();

    static {
        // 初始化单位编码，严格遵循接口标准中的目录命名规则
        UNIT_CODE_MAP.put("法院", "fy");
        UNIT_CODE_MAP.put("检察院", "jcy");
        UNIT_CODE_MAP.put("公安局", "gaj");
        UNIT_CODE_MAP.put("看守所", "kss");
        UNIT_CODE_MAP.put("司法局", "sfj");
    }

    // 数据类型（业务数据、消息数据）
    private static final String[] DATA_TYPES = {"data", "msg"};

    // 发送/接收类型
    private static final String[] SEND_RECEIVE_TYPES = {"send", "receive"};

    public static void main(String[] args) {
        //System.out.println("开始构建BJCM FTP共享文件夹结构...");
        //buildFtpDirectories();
        //System.out.println("文件夹构建任务结束！");
        insertBody(1, "");
    }

    /**
     * 构建完整的FTP目录结构
     */
    private static void buildFtpDirectories() {
        // 1. 构建顶层目录（bjcm）
        buildSingleDirectory(ROOT_PATH);

        // 2. 遍历每个政法单位，构建子目录
        for (Map.Entry<String, String> unitEntry : UNIT_CODE_MAP.entrySet()) {
            String unitName = unitEntry.getKey();
            String unitCode = unitEntry.getValue();

            System.out.printf("正在构建【%s】相关目录...%n", unitName);

            // 单位根目录（如：bjcm/fy）
            String unitRootPath = ROOT_PATH + "\\" + unitCode;
            buildSingleDirectory(unitRootPath);

            // 构建“send/receive”目录
            for (String srType : SEND_RECEIVE_TYPES) {
                String srPath = unitRootPath + "\\" + srType;
                buildSingleDirectory(srPath);

                // 构建“data/msg”子目录
                for (String dataType : DATA_TYPES) {
                    String fullPath = srPath + "\\" + dataType;
                    buildSingleDirectory(fullPath);
                }
            }
            System.out.printf("【%s】目录构建完成！%n", unitName);
        }
    }

    /**
     * 创建单个目录（支持多级目录递归创建）
     * @param dirPath 目录完整路径
     */
    private static void buildSingleDirectory(String dirPath) {
        Path path = Paths.get(dirPath);
        try {
            // 若目录不存在，则创建（包括所有父目录）
            if (!Files.exists(path)) {
                Files.createDirectories(path);
                System.out.printf("成功创建目录：%s%n", dirPath);
            } else {
                System.out.printf("目录已存在，跳过创建：%s%n", dirPath);
            }
        } catch (Exception e) {
            System.err.printf("创建目录失败：%s，原因：%s%n", dirPath, e.getMessage());
        }
    }

    public static void insertBody(int index, String body) {
        File file = new File(DICT_PATH);

        // 获取文件列表并按字母顺序排序
        String[] fileList = file.list();
        // 使用自然排序进行排序
        Arrays.sort(fileList, new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                // 使用正则去掉非数字字符来进行自然排序
                return naturalCompare(o1, o2);
            }
        });

        // 输出排序后的文件列表
        for (String sqlFile : fileList) {
            File file1 = new File(file, sqlFile);
            try (FileWriter fileWriter = new FileWriter(file1)){
            }catch (IOException e){
                System.out.println();
            }
            System.out.print('"' +sqlFile + '"' + ",");
        }
    }

    // 自然排序方法
    private static int naturalCompare(String o1, String o2) {
        // 使用正则表达式来分割文件名中的数字和字母
        String[] parts1 = o1.split("(?<=\\D)(?=\\d)|(?<=\\d)(?=\\D)");
        String[] parts2 = o2.split("(?<=\\D)(?=\\d)|(?<=\\d)(?=\\D)");

        int length = Math.min(parts1.length, parts2.length);

        for (int i = 0; i < length; i++) {
            // 比较数字
            if (isNumeric(parts1[i]) && isNumeric(parts2[i])) {
                int num1 = Integer.parseInt(parts1[i]);
                int num2 = Integer.parseInt(parts2[i]);
                if (num1 != num2) {
                    return Integer.compare(num1, num2);
                }
            } else {
                // 如果是字符串部分，直接按字典顺序比较
                int result = parts1[i].compareTo(parts2[i]);
                if (result != 0) {
                    return result;
                }
            }
        }

        return Integer.compare(parts1.length, parts2.length);
    }

    // 判断是否为数字
    private static boolean isNumeric(String str) {
        return str.matches("\\d+");
    }
}
